import uvicorn
from fastapi import FastAPI, Path, Query, Body, APIRouter
import uvicorn
from pydantic import BaseModel, Field
from typing import Optional, Union, List, Literal ,Annotated
from enum import Enum


day01 = APIRouter()

# deprecated=True 标记接口被弃用
@day01.get("/", tags=["Hello world"], description="描述信息", summary="接口描述信息")
def hello_fastapi():
    return {"message": "hello AI0804"}




@day01.get("/item")
def hello_item():
    return "Hello --item--  hello ...."

@day01.post("/item")
def hello_item():
    return "Hello --item-- Post ...."

# 路径参数
@day01.get("/item/{itemid}")
def get_item(itemid: str):
    return {"message": itemid}

# 路径参数(重复)
@day01.get("/item/me")
def get_item(itemid: str = None):
    return {"message": itemid}



# 查询参数
@day01.get("/items")
def get_item_info(skip: int, limit: int = 10):
    """
        :param skip: 起始页码
        :param limit: 每页的数量
        :return: items中当前页的数据
    """
    return {"message": skip, "limit": skip + limit}


# 请求体
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: float = 0.0

@day01.post("/items/add")
def add_item(item: Item):
    print(item.name, item.price)
    print(item.dict)
    return item

# 定义一个枚举值的类
class OrderStatus(str, Enum):
    ordered = 1001
    order_wait_payment = 1002
    order_paymented = 1003
    order_finished = 1004

@day01.get("/items/order")
def order(ost: OrderStatus):
    if ost == OrderStatus.ordered:
        return {"message": "已下单未支付"}
    elif ost == OrderStatus.order_paymented:
        return {"message": "已支付，待发货"}
    elif ost == OrderStatus.order_finished:
        return {"message": "已确认收货"}
    else:
        return {"message": "其它信息"}

# 路径参数
@day01.get("/item/url/{url:path}")
def get_item(url: str):
    return {"message": url}

'''
    查询参数声明为None = None ,表示可选参数，并且默认值是None
'''
@day01.get("/items/id/{item_id}")
def add_item_id(item_id: str, q: Optional[str] = None):
    if q:
        return {"item_id": item_id, "q": q}
    return {"item_id": item_id}


'''
    对查询参数进行校验
    Query(default=None    表示是可选参数，默认值是None
'''
@day01.get("/items/query")
def parameter_query(item_id: int, q : Union[str, None] = Query(default=None, max_length=50, min_length=3)):
    items = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        items.update({"q":q})
    return items

'''
    对查询参数进行校验
    Query(...): 表示是必填参数, 不填写默认值也表示为必填参数
    query 中添加对参数的更多描述信息
'''
@day01.get("/items/query1")
def parameter_query(
        item_id: int,
        # 必须以a开头
        q : str = Query(..., max_length=50, min_length=3, regex='^a', title='查询关键字', description='必须以a开头，至少三个字符，最多50个'),
        age: int = Query(..., ge=0, lt=200),
        values: List = Query(['v1', 'v2'], alias='别名', deprecated=True)
    ):
    items = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        items.update({"q":q, "age":age, "values": values})
    return items

'''
    对路径参数的校验
'''
@day01.get("/items/path/{itemid}")
def parameter_path(
        *,
        itemid: int = Path(title='Item 编号', ge=100, le=2000),
        q: str,
        size: float = Query(default=None, le=50.0)
        ):
    results = {"item_id": itemid}
    results.update({'q': q})
    if size:
        results.update({"size": size})
    return results

'''
    晚上的作业：
    1. 课件中的代码，敲一遍
    2. 对学生管理系统提供API接口
        a. 查询所有学生的信息
        b. 根据学生编号查询某个学生的信息
        c. 添加学生信息
        d. 根据学生姓名查询学生的信息
    3. 根据学生编号更新学生的信息（可以后做）
    要求：
        学生信息的存储在字典，列表中
        学生的信息：
            学生编号：
            学生姓名：
            学生邮箱：
            手机号码：
            年龄：
            班级：
'''



